package cn.sciento.iam.app.service.impl;

import cn.sciento.iam.api.dto.SubModuleDTO;
import cn.sciento.iam.app.service.MenuService;
import cn.sciento.iam.app.service.RoleService;
import cn.sciento.iam.app.service.SubModuleService;
import cn.sciento.iam.domain.entity.Role;
import cn.sciento.iam.domain.entity.SubModule;
import cn.sciento.iam.domain.entity.TenantModule;
import cn.sciento.iam.domain.repository.SubModuleRepository;
import cn.sciento.iam.domain.repository.TenantModuleRepository;
import cn.sciento.iam.infra.common.utils.UserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 子模块设置

 */
@Service
public class SubModuleServiceImpl implements SubModuleService {

    @Autowired
    MenuService menuService;

    @Autowired
    RoleService roleService;

    @Autowired
    SubModuleRepository subModuleRepository;

    @Autowired
    TenantModuleRepository tenantModuleRepository;

    @Override
    public void disable(SubModule subModule) {
        SubModule module = subModuleRepository.selectByPrimaryKey(subModule.getId());
        Assert.notNull(module, "hiam.warn.module.notFound");
        module.disable();
        subModuleRepository.updateOptional(module,SubModule.FIELD_ENABLED_FLAG);
    }

    @Override
    public void enable(SubModule subModule) {
        SubModule module = subModuleRepository.selectByPrimaryKey(subModule.getId());
        Assert.notNull(module, "hiam.warn.module.notFound");
        module.enable();
        subModuleRepository.updateOptional(module,SubModule.FIELD_ENABLED_FLAG);
    }

    @Override
    public List<SubModule> listSubModule(SubModuleDTO subModule) {
        return subModuleRepository.listSubModule(subModule);
    }

    @Override
    public void assignTenant(Long tenantId,List<SubModule> subModules) {
        TenantModule tenantModuleParam = new TenantModule();
        tenantModuleParam.setTenantId(tenantId);
        tenantModuleRepository.delete(tenantModuleParam);
        List<TenantModule> tenantModules = subModules.stream().map(subModule -> {
            TenantModule tenantModule = new TenantModule();
            tenantModule.setTenantId(tenantId);
            tenantModule.setModuleCode(subModule.getCode());
            return tenantModule;
        }).collect(Collectors.toList());
        tenantModuleRepository.batchInsert(tenantModules);
    }

    @Override
    public List<SubModule> getUserModule(Long userId, Long tenantId) {
        List<Role> roles = roleService.selectUserRole(tenantId,userId);
        List<Long> roleIdList = roles.stream().map(Role::getId).collect(Collectors.toList());

        List<SubModule> subModuleList = subModuleRepository.selectRoleModule(roleIdList, tenantId);
        return subModuleList;
    }

    @Override
    public void delete(SubModule subModule) {
        TenantModule tenantModule = new TenantModule();
        tenantModule.setModuleCode(subModule.getCode());
        tenantModuleRepository.delete(tenantModule);
        subModuleRepository.deleteByPrimaryKey(subModule);
    }
}
